package api

import (
	"net/http"

	"gitee.com/go-kade/go12/vblog/apps/token"
	"gitee.com/go-kade/go12/vblog/ioc"
	"gitee.com/go-kade/go12/vblog/response"
	"github.com/gin-gonic/gin"
)

type TokenApiHeadler struct {
	svc token.Service //依赖控制器
}

func NewTokenApiHeadler(TokenServiceImpl token.Service) *TokenApiHeadler {
	return &TokenApiHeadler{
		// svc: TokenServiceImpl,
		svc: ioc.Controller().Get(token.AppName).(token.Service),
	}
}

// 需要把HandleFunc 添加到Root路由，定义 API- -> HandLeFunc
// 可以选择把这Handler上的HandLeFunc都注册到路由上面
func (h *TokenApiHeadler) Registry(r gin.IRouter) {
	// r 是gin的路由器
	v1 := r.Group("v1")
	v1.POST("/token/", h.Login)
	v1.DELETE("/tokens/", h.LoginOut)
}

func init() {
	ioc.ApiHandler().Registry(&TokenApiHeadler{})
}

// 定义对象的初始化
func (i *TokenApiHeadler) Init1() error {
	i.svc = ioc.Controller().Get(token.AppName).(token.Service)
	return nil
}

// 定义托管到Ioc里面的名称
func (i *TokenApiHeadler) Name() string {
	return token.AppName
}

func (h *TokenApiHeadler) Login(g *gin.Context) {
	//1. 获取用户的请求参数，参数在Body里面
	// 一定要使用json
	req := token.NewLoginRequst()
	if err := g.BindJSON(req); err != nil {
		g.JSON(http.StatusBadRequest, err.Error())
		return
	}
	// 2. 执行逻辑
	ins, err := h.svc.Login(g.Request.Context(), req) //g.Request.Context() http请求的context
	if err != nil {
		response.Failed(g, err) //g.JSON(http.StatusBadRequest, err.Error())
		return
	}
	// access_token 通过SetCookie 直接写到浏览器客户端(Web)
	//这种方式直接设置cookis
	g.SetCookie(token.TOKEN_COOKIE_NAME, ins.AccessToken, 0, "/", "localhost", false, true)

	// 3. 返回响应
	g.JSON(http.StatusOK, ins)
}

func (h *TokenApiHeadler) LoginOut(g *gin.Context) {
	//1. 获取用户的请求参数，参数在Body里面
	// 一定要使用json
	req := token.NewLoginoutRequst()
	if err := g.BindJSON(req); err != nil {
		g.JSON(http.StatusBadRequest, err.Error())
		return
	}
	// 2. 执行逻辑
	err := h.svc.Logout(g.Request.Context(), req) //g.Request.Context() http请求的context
	if err != nil {
		response.Failed(g, err) //g.JSON(http.StatusBadRequest, err.Error())
		return
	}
	// 3. 返回响应
	g.JSON(http.StatusOK, err)
}
